package lin

import (
	"bytes"
	"encoding/base64"
	"image"
	 "image/gif" // 注册解码器
	 "image/jpeg"
	 "image/png"
)

type T图片 struct {
	Img image.Image // 解析后的图像
	Err error       // 最近一次错误
	类型 string
}

// ----------------------------------
// 核心私有解码函数 
// ----------------------------------
func (类 *T图片) decode(r *bytes.Reader, 类型 string) {
	if 类型 == "" {
		类.Img, _, 类.Err = image.Decode(r)
		return
	}
	switch 类型 {
	case "png":
		类.Img, 类.Err = png.Decode(r)
	case "jpeg", "jpg":
		类.Img, 类.Err = jpeg.Decode(r)
	case "gif":
		类.Img, 类.Err = gif.Decode(r)
	default:
		类.Err = image.ErrFormat
	}
}

// ----------------------------------
// 1. 从字节切片载入
//"png","jpeg", "jpg","gif" 支持的类型
// ----------------------------------
func (类 *T图片) ZR载入(图片数据 []byte, 类型 string) bool {
	类.Img, 类.Err = nil, nil
	类.decode(bytes.NewReader(图片数据), 类型)
	类.类型=类型
	return 类.Err == nil
}

// ----------------------------------
//  2. 从 base64 字符串载入
//     支持标准编码和 URL 编码，自动去除 data:image/...;base64, 前缀
//
// ----------------------------------
func (类 *T图片) ZR载入Base64(base64字符串 string, 类型 string) bool {
	类.Img, 类.Err = nil, nil

	// 去掉可能的 data URI 头
	const prefix = "base64,"
	if idx := bytes.IndexByte([]byte(base64字符串), ','); idx != -1 {
		base64字符串 = base64字符串[idx+1:]
	}

	// 解码 base64
	var raw []byte
	raw, 类.Err = base64.StdEncoding.DecodeString(base64字符串)
	if 类.Err != nil {
		// 再试 URL 编码
		raw, 类.Err = base64.URLEncoding.DecodeString(base64字符串)
		if 类.Err != nil {
			return false
		}
	}

	类.decode(bytes.NewReader(raw), 类型)
	return 类.Err == nil
}

func (类 *T图片) D到Base64( 带Mime头 bool) string {
	if 类.Img == nil {
		类.Err = image.ErrFormat
		return ""
	}
	类型:=类.类型

	var buf bytes.Buffer
	switch 类型 {
	case "png":
		类.Err = png.Encode(&buf, 类.Img)
	case "jpeg", "jpg":
		类.Err = jpeg.Encode(&buf, 类.Img, &jpeg.Options{Quality: 95})
	case "gif":
		类.Err = gif.Encode(&buf, 类.Img, &gif.Options{NumColors: 256})
	default:
		类.Err = image.ErrFormat
	}
	if 类.Err != nil {
		return ""
	}

	str := base64.StdEncoding.EncodeToString(buf.Bytes())
	if 带Mime头 {
		switch 类型 {
		case "jpeg", "jpg":
			str = "data:image/jpeg;base64," + str
		case "gif":
			str = "data:image/gif;base64," + str
		default:
			str = "data:image/png;base64," + str
		}
	}
	return str
}
